#include<stdio.h>
#include<unistd.h>

int g_val = 0;

int main()
{
  printf("the g_val is %d\n", g_val);
  pid_t id = fork();
  if(id == 0)
  {
    //child
   int count = 0;
   while(1)
   {
     printf("child--pid:%d ppid:%d g_val:%d &g_val:%p\n", getpid(), getppid(), g_val, &g_val);
     sleep(1);
     if(count == 5)
     {
       g_val = 100;
     }
     count++;
   }
  }
  else if(id > 0)
  {
    //parent 
    while(1)
    {
     printf("parent--pid:%d ppid:%d g_val:%d &g_val:%p\n", getpid(), getppid(), g_val, &g_val);
     sleep(1);
    }
  }
  else{
    //TODO
  }
  return 0;
}

//int g_unval;
//int g_val = 100;
//
//int main(int argc, char* argv[], char* env[])
//{
//  printf("code addr: %p\n", main);  //代码区
//
//  const char* p = "hello world!";   //p在栈上，指向字符常量区的一个字符串
//  printf("read only: %p\n", p);
//  
//  printf("global val: %p\n", &g_val);   //已初始化全局数据区
//
//  printf("global uninit val: %p\n", &g_unval);    //未初始化全局数据区
//  
//  char* q = (char*)malloc(20);    //q在栈上，指向堆区上的一块空间
//  printf("heap addr: %p\n", q);   //堆区
//
//
//  printf("stack addr_first: %p\n", &p);
//  printf("stack addr_second: %p\n", &q);   //栈区
//
//  printf("args addr_first: %p\n", argv[0]);
//  printf("args addr_last: %p\n", argv[argc -  1]);
//
//  printf("env addr: %p\n", env[0]);
//  return 0;
//}
